from docx import Document
from docx.shared import Pt
from tkinter import Tk
from tkinter.font import families
import os


def clen(text):
    """计算字符串的长度，中文字符算一个字，其他字符也按一个字计算"""
    return len([c for c in text if '\u4e00' <= c <= '\u9fff']) + len([c for c in text if not('\u4e00' <= c <= '\u9fff')])


def generate_word_file(target_chars_in_wan):  # 输入单位为“万字”
    target_chars = int(target_chars_in_wan * 10000)  # 转换为目标字符数
    doc = Document()
    fonts = list(families(Tk()))  # 获取系统可用字体
    font_index = 0
    font_size = 26  # 初始字号为26
    step = -1  # 字号递减步长

    current_chars = 0  # 当前累计字数
    line_count = 0  # 行计数器
    temp = 0

    while current_chars < target_chars:
        font_name = fonts[font_index]
        line_count += 1
        text = f"{line_count} {font_name}|叶紫东到此一游！abcdefg"  # 每行内容包含行号

        # 使用 clen 函数计算字符串长度
        current_chars += clen(text)
        temp += clen(text)

        paragraph = doc.add_paragraph(text)
        run = paragraph.runs[0]
        run.font.name = font_name
        run.font.size = Pt(font_size)

        # 更新字体索引和字号
        font_index = (font_index + 1) % len(fonts)
        font_size += step
        if font_size < 8:  # 最小字号为8
            font_size = 26  # 回到最大字号

        # 每增加 1 万字显示一次进度
        if temp >= 10000:
            temp = 0
            print(f"当前进度：已写入字符数：{current_chars / 10000:.2f}万字")

    # 最后保存文件
    final_file = f"Word测试文件({target_chars_in_wan}万字).docx"
    doc.save(final_file)

    # 计算文件大小
    file_size_mb = os.path.getsize(final_file) / (1024 * 1024)
    print(f"Word 文件生成完成：{final_file}，总字符数：{target_chars_in_wan}万字，文件大小：{file_size_mb:.2f}MB")


def generate_excel_file(size_in_mb):
    # 占位符：生成 Excel 文件的逻辑
    wb = openpyxl.Workbook()
    ws = wb.active

    target_size_bytes = size_in_mb * 1024 * 1024
    estimated_cell_size = 100  # 每个单元格的平均字节数（可根据实际情况调整）
    cells_to_write = target_size_bytes // estimated_cell_size

    for i in range(1, cells_to_write + 1):
        ws.cell(row=i, column=1, value=f"Cell {i}")

    final_file = f"output_{size_in_mb}MB.xlsx"
    wb.save(final_file)
    actual_size = os.path.getsize(final_file) / (1024 * 1024)
    print(f"Excel 文件生成完成：{final_file}，实际大小：{actual_size:.2f}MB")


def generate_ppt_file(size_in_mb):
    # 占位符：生成 PPT 文件的逻辑
    prs = Presentation()

    target_size_bytes = size_in_mb * 1024 * 1024
    estimated_slide_size = 50000  # 每张幻灯片的平均字节数（可根据实际情况调整）
    slides_to_write = target_size_bytes // estimated_slide_size

    for _ in range(slides_to_write):
        slide_layout = prs.slide_layouts[0]
        slide = prs.slides.add_slide(slide_layout)
        title = slide.shapes.title
        title.text = "叶紫东到此一游！"

    final_file = f"output_{size_in_mb}MB.pptx"
    prs.save(final_file)
    actual_size = os.path.getsize(final_file) / (1024 * 1024)
    print(f"PPT 文件生成完成：{final_file}，实际大小：{actual_size:.2f}MB")


def generate_pdf_file(size_in_mb):
    # 占位符：生成 PDF 文件的逻辑
    pdf = FPDF()

    target_size_bytes = size_in_mb * 1024 * 1024
    estimated_page_size = 50000  # 每页的平均字节数（可根据实际情况调整）
    pages_to_write = target_size_bytes // estimated_page_size

    for _ in range(pages_to_write):
        pdf.add_page()
        pdf.set_font("Arial", size=12)
        pdf.cell(200, 10, txt="叶紫东到此一游！", ln=True)

    final_file = f"output_{size_in_mb}MB.pdf"
    pdf.output(final_file)
    actual_size = os.path.getsize(final_file) / (1024 * 1024)
    print(f"PDF 文件生成完成：{final_file}，实际大小：{actual_size:.2f}MB")


def main():
    print("请选择要生成的文件类型：")
    print("1. Word 文件")
    print("2. Excel 文件")
    print("3. PPT 文件")
    print("4. PDF 文件")
    choice = input("请输入选项（1-4）：")

    if choice not in ["1", "2", "3", "4"]:
        print("无效的选项，请重新运行程序。")
        return

    if choice == "1":
        try:
            chars_input = input("请输入目标字数（单位：万字，默认10万字）：")
            target_chars_in_wan = float(chars_input.strip()) if chars_input.strip() else 10  # 默认值为10万字
            generate_word_file(target_chars_in_wan)
        except ValueError:
            print("无效的字符数值，默认生成10万字的文件。")
            generate_word_file(10)
    elif choice == "2":
        try:
            size_input = input("请输入文件大小（单位：MB，默认50）：")
            size_in_mb = int(size_input.strip()) if size_input.strip() else 50
            generate_excel_file(size_in_mb)
        except ValueError:
            print("无效的大小值，默认使用50MB。")
            generate_excel_file(50)
    elif choice == "3":
        try:
            size_input = input("请输入文件大小（单位：MB，默认50）：")
            size_in_mb = int(size_input.strip()) if size_input.strip() else 50
            generate_ppt_file(size_in_mb)
        except ValueError:
            print("无效的大小值，默认使用50MB。")
            generate_ppt_file(50)
    elif choice == "4":
        try:
            size_input = input("请输入文件大小（单位：MB，默认50）：")
            size_in_mb = int(size_input.strip()) if size_input.strip() else 50
            generate_pdf_file(size_in_mb)
        except ValueError:
            print("无效的大小值，默认使用50MB。")
            generate_pdf_file(50)


if __name__ == "__main__":
    main()